package player;

import java.awt.Color;
import java.util.ResourceBundle;

import adapter.Adapter;
import desktop_codebehind.Car;

public class PlayerController {

	private Player[] players;
	private int numberPlayers;
	private Adapter adapter;
	private ResourceBundle msg;

	/**
	 * Opretter et array af spillere
	 * @param numberPlayers Antallet af spillere der skal oprettes
	 * @param money Spillernes startsaldo
	 */
	public PlayerController(int numberPlayers, int money){
		this.numberPlayers = numberPlayers;
		adapter = new Adapter();
		this.msg = adapter.getBundle();
		players = new Player[numberPlayers];

		for (int n = 0; n < numberPlayers; n++){
			players[n] = new Player(money);
		}
	}

	/**
	 * Returnerer spillerarray
	 * @return Array af spillere
	 */
	public Player[] getPlayers(){
		return players;
	}

	/**
	 * Opret spillere og sæt dem på spillepladen.
	 */
	public void createPlayers(){
		Adapter adapter = new Adapter();
		int[][] color = new int[][] {{255,0,0},{0,255,0},{0,0,255},{255,255,0},{0,255,255},{255,0,255}};
		for ( int i=0; i<numberPlayers; i++)
		{ //<-- oprettelse af spillere
			String name = adapter.showTypeName();// Adapter fortæller GUI'en at den skal vise: "indtast spillernavn"
			players[i].setName(name); 
			if (players[i].getName()==null || players[i].getName().isEmpty() || checkNames(players[i]) == true) // Hvis intet indtastes, får spillerne navne fra spiller1-6
			{
				int r = i+1;
				players[i].setName(adapter.player()+r);				
			}
			
			// Opretter color-objekt til hver spiller (R,B,G)
			Color sColor = new Color(color[i][0],color[i][1],color[i][2]);
			// Beder spilleren vælge en biltype
			Car car;
			int type = adapter.chooseCar(players[i].getName()); // Brugeren får lov at vælge hvilken type bil han ønsker
			switch (type){
			case 1: {
				car = new Car.Builder()
				.typeRacecar()
				.primaryColor(sColor)
				.build();
			}
			break;
			case 2: {
				car = new Car.Builder()
				.typeUfo()
				.primaryColor(sColor)
				.build();
			}
			break;
			case 3: {
				car = new Car.Builder()
				.typeTractor()
				.primaryColor(sColor)
				.build();
			}
			break;
			case 4: {
				car = new Car.Builder()
				.typeCar()
				.primaryColor(sColor)
				.build();
			}
			break;
			default: {
				car = new Car.Builder()
				.typeCar()
				.primaryColor(sColor)
				.build();
			}
			break;
			}
			adapter.addPlayer(players[i].getName(), players[i].getAccount().getBalance(), car); // Tilføjer spilleren på spillepladen
			adapter.setCar(1, players[i].getName()); // Placerer bilen på start feltet.
		}
	}

	/**
	 * Tjekker om spilleren har indtastet et navn der er identisk med en anden spiller, samt
	 * om længden af spillerens navn er indenfor de accepterede værdier (maks 17)
	 * @param player Spilleren der tjekkes
	 * @return true = spilleren har indtastet et ugyldigt navn
	 */
	private boolean checkNames(Player player) {
		boolean output = false;
		for (int i=0; i<players.length;i++){
			if (player != players[i]){
				if (player.getName().equals(players[i].getName()) == true){
					output = true;
				}
			}
		}
		if (player.getName().length() > 17){
			output = true;
		}
		if (output == true){
			adapter.showMessage(msg.getString("Invalid_Name"));
		}
		return output;
	}

	/**
	 * Opdaterer spilleren når en runde er afsluttet
	 * @param player Spilleren der skal opdateres
	 * @param data Array af data der opdateres på spilleren. 
	 * data[0] = balance som spillerens konto skal opdateres med
	 * data[1] = Spillerens position på brættet (0-39)
	 * data[2] = Er spilleren i fængsel eller ej (0 = false, 1 = true)
	 */
	public void updPlayer(Player player, int[] data){
		player.getAccount().updBalance(data[0]);
		adapter.setBalance(player.getName(), player.getAccount().getBalance());
		if (data[1] >= 0 && data[1] <= 39){
			player.setPosition(data[1]);
		}
		else {
			System.out.println("Forkert data modtaget i PlayerController.updPlayer() - data[1] værdier skal være fra 0-39. Modtaget: " + data[1]);
		}
		if (data[2] == 0){
			player.setInJail(false);
		}
		else if (data[2] == 1){
			player.setInJail(true);
		}
		else if (data[2] > 1){
			System.out.println("Forkert data modtaget i PlayerController.updPlayer() - data[2] værdier skal være 0-1. Modtaget: " + data[2]);
		}
	}
}
